#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Created on Sun Mar 17 07:25:06 2019

@author: wuhuan
"""

#1. 以Lena为原始图像，通过OpenCV实现平均滤波，高斯滤波及中值滤波，比较滤波结果。
import cv2
img = cv2.imread('/Users/wuhuan/Desktop/lena.jpg')
img_mean = cv2.blur(img, (5,5))
# 高斯滤波
img_Guassian = cv2.GaussianBlur(img,(5,5),0)
# 中值滤波
img_median = cv2.medianBlur(img, 5)
# 展示不同的图片
titles = ['srcImg','mean', 'Gaussian', 'median']
cv2.imshow("srcImg",img)
cv2.imshow("mean",img_mean)
cv2.imshow("Gaussian",img_Guassian)
cv2.imshow("median",img_median)
cv2.waitKey(0)
cv2.destroyAllWindows()
cv2.waitKey(1)
cv2.waitKey(1)
cv2.waitKey(1)
cv2.waitKey(1)
#从结果中可以看到平均滤波虽然去除了噪声，但也使得图像看起来比较模糊，一般不会单独使用；高斯滤
#波可以看出噪声减少，图像出现稍微模糊；中值滤波也可以看出噪声减少，模糊程度小于平均滤波但大
#于高斯滤波，眼睫毛，发丝，眼角处均要比高斯滤波要模糊。
#最后的4个waitkey用于解决mac无法关闭图片展示的问题。

#2. 以Lena为原始图像，通过OpenCV使用Sobel及Canny算子检测，比较边缘检测结果。
import cv2
img = cv2.imread('/Users/wuhuan/Desktop/lena.jpg',0)
sobelx = cv2.Sobel(img,cv2.CV_64F, 1, 0, ksize=7)
sobely = cv2.Sobel(img, cv2.CV_64F, 0, 1, ksize=3)
sobelXY = cv2.Sobel(img, cv2.CV_64F, 1, 1, ksize=3)
canny=cv2.Canny(img,100,200)
titles = ['srcImg2','sx', 'sy', 'sxy','cany']
cv2.imshow("srcImg2",img)
cv2.imshow("sx",sobelx)
cv2.imshow("sy",sobely)
cv2.imshow("sxy",sobelXY)
cv2.imshow("cany",canny)
cv2.waitKey(0)
cv2.destroyAllWindows()
cv2.waitKey(1)
cv2.waitKey(1)
cv2.waitKey(1)
cv2.waitKey(1)

#3. 在OpenCV安装目录下找到课程对应演示图片(安装目录\sources\samples\data)，首先计算灰度
#直方图，进一步使用大津算法进行分割，并比较分析分割结果。 
import cv2
import numpy as np
from matplotlib import pyplot as plt
img = cv2.imread('/Users/wuhuan/Desktop/pic2.png',0)
plt.hist(img.ravel(),256,[0,256]);
plt.show()
cv2.imshow('imagshow', img)   
retval,dst = cv2.threshold(img, 0, 255, cv2.THRESH_OTSU) #使用大津算法进行图像二值化
cv2.namedWindow("dst", 2)   
cv2.imshow("dst", dst)
cv2.waitKey(0)
cv2.destroyAllWindows()
cv2.waitKey(1)
cv2.waitKey(1)
cv2.waitKey(1)
cv2.waitKey(1)

#4. 使用米粒图像，分割得到各米粒，首先计算各区域(米粒)的面积、长度等信息，进一步计算面积、长
#度的均值及方差，分析落在3sigma范围内米粒的数量。
import cv2
import numpy as np
from matplotlib import pyplot as plt
img = cv2.imread('/Users/wuhuan/Desktop/rice.png') 
gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
dst = cv2.adaptiveThreshold(gray,255, cv2.ADAPTIVE_THRESH_MEAN_C, cv2.THRESH_BINARY,101, 1)
element = cv2.getStructuringElement(cv2.MORPH_CROSS,(3, 3))#形态学去噪
dst=cv2.morphologyEx(dst,cv2.MORPH_OPEN,element)  #开运算去噪
cv2.imshow('imagshow', dst) #显示阈值分割后的图片
cv2.waitKey(0)
cv2.destroyAllWindows()
cv2.waitKey(1)
cv2.waitKey(1)
cv2.waitKey(1)
cv2.waitKey(1)
dst,contours,hierarchy = cv2.findContours(dst,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)  #轮廓检测函数
cv2.drawContours(dst,contours,-1,(120,0,0),2)  #绘制轮廓

count=0 #米粒总数
ares_avrg=0  #米粒平均
#遍历找到的所有米粒
for cont in contours:

    ares = cv2.contourArea(cont)#计算包围性状的面积

    if ares<50:   #过滤面积小于10的形状
        continue
    count+=1    #总体计数加1
    ares_avrg+=ares

    print("{}-blob:{}".format(count,ares),end="  ") #打印出每个米粒的面积

    rect = cv2.boundingRect(cont) #提取矩形坐标

    print("x:{} y:{}".format(rect[0],rect[1]))#打印坐标




